package com.cskaoyan.javase.array._5operation._0traverse;


/**
 * 数组元素的遍历：
 * 从头到尾访问一遍数组中的元素，是数组做输出，做赋值等其它操作的前提。
 *
 * @since 11:10
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        // 使用循环遍历数组，如果数组是一维数组，那么单层for足够了
        /*for (int i = 0; i < 3; i++) {
            System.out.println(arr[i]);
        }*/
        // 可以把数组的长度，用于结束循环
        // 数组使用for循环遍历的快捷键 数组名.fori
        // 数组遍历是常见操作，为了复用代码提取方法
        // arr = new int[0];
        arr = null;
        traverse7(arr);
    }

    /**
     *  循环遍历打印数组中的元素
     * @param target 被遍历打印元素的目标数组
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/03 11:15
     */
    public static void traverse(int[] target) {
        for (int i = 0; i < target.length; i++) {
            System.out.println(target[i]);
        }
    }

    // 上述方法格式太丑了，我希望打印效果是：[元素1，元素2....] 比如[1, 2, 3]
    public static void traverse2(int[] target) {
        System.out.print("[");
        for (int i = 0; i < target.length; i++) {
            System.out.print(target[i] + "，");
        }
        System.out.println("]");
    }

    /*
        去掉上述方法中最后一个元素的逗号，两种方法：
            1.if判断
            2.退格 \b
     */
    public static void traverse3(int[] target) {
        System.out.print("[");
        for (int i = 0; i < target.length; i++) {
            System.out.print(target[i] + "，");
        }
        System.out.println("\b]");
    }

    public static void traverse4(int[] target) {
        System.out.print("[");
        for (int i = 0; i < target.length; i++) {
            // 判断如果是最后一个元素，直接打印取值，不打印逗号
            if (i == target.length - 1) {
                System.out.print(target[i]);
                break;
            }

            System.out.print(target[i] + "，");
        }
        System.out.println("]");
    }

    /*
        上述方法，从格式上已经很完善了
        但是这些方法还是有缺陷的
        主要在于
        方法无法接收长度为0的数组输入
        和null数组的输入
        所以我们需要做一下判断会更好
        排除不正常的数组输入
     */
    public static void traverse5(int[] target) {
        // 判断数组长度为0，无需遍历它，直接提示用户输入一个正常的数组。
        /*
            这里是判断长度为0好，还是判断不为0好
            if选择中要执行的语句是越长越好，还是越短越好？
            很明显越短越好
            所以我们在开发中，写if的时候，尽量判断能够
            让if执行语句更少的条件
            提升代码可读性！
         */
        if (target.length == 0) {
            System.out.println("您输入的数组长度为0，请重新输入！");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < target.length; i++) {
            System.out.print(target[i] + "，");
        }
        System.out.println("\b]");
    }


    public static void traverse6(int[] target) {
        // 先判断数组等于null，无需执行下列代码，直接结束
        if (target == null) {
            System.out.println("您输入的数组为null，从重新输入！");
            return;
        }

        // 判断数组长度为0，无需遍历它，直接提示用户输入一个正常的数组。
        if (target.length == 0) {
            System.out.println("您输入的数组长度为0，请重新输入！");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < target.length; i++) {
            System.out.print(target[i] + "，");
        }
        System.out.println("\b]");
    }

    // 假如我把长度为0和为null的数组 这两个条件合并 一起处理
    public static void traverse7(int[] target) {
        // 只要不是正常数组,都告诉用户输出错误
        // 经典格式 先判null 短路或 然后判断其它条件 避免空指针异常
        /*
            短路或 前面target为null后 后面不会执行
            如果是非短路或 前面即便是null  后面也会执行 就会空指针异常
         */
        if (target == null || target.length == 0){
            System.out.println("输入错误,请重新输入!");
            return;
        }

            System.out.print("[");
        for (int i = 0; i < target.length; i++) {
            System.out.print(target[i] + "，");
        }
        System.out.println("\b]");
    }

}
